package middleware

import (
	"github.com/golang-jwt/jwt/v4"
	"go-GameTimer-X/response"
	"go-GameTimer-X/utils"
	"time"

	"github.com/gin-gonic/gin"
)

// JWTAuthMiddleware JWT认证中间件
func JWTAuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		tokenString := c.GetHeader("Authorization")
		if tokenString == "" {
			response.FailWith401(c)
			c.Abort()
			return
		}

		// 从配置文件中获取 JWT 配置
		secret := "your-secret-key" // 实际应用中应从配置中读取

		// 解析 JWT Token
		token, err := utils.ParseJWT(tokenString, secret)
		if err != nil || !token.Valid {
			//c.JSON(http.StatusUnauthorized, gin.H{"error": "无效的Token"})
			response.FailWithMessage("无效的Token", c)
			c.Abort()
			return
		}

		claims := token.Claims.(jwt.MapClaims)
		userID := claims["sub"].(string)
		role := claims["role"].(string)

		// 可以在这里将用户信息存储到上下文，供后续处理函数使用
		c.Set("userID", userID)
		c.Set("role", role)

		// 检查 Token 是否即将过期（可选）
		if float64(time.Now().Unix()) > claims["exp"].(float64)-3600 { // 如果 Token 在1小时内过期
			// 自动生成新的 Token 并设置到响应头
			newToken, err := utils.GenerateJWT(userID, secret, 86400)
			if err == nil {
				c.Header("X-New-Token", newToken)
			}
		}

		c.Next()
	}
}
